package com.example.design.component;

/**
 * 组合模式有两种不同的实现，分别为透明模式和安全模式
 * 代码示例为 透明模式
 * Component（抽象构件）：它可以是接口或抽象类，为叶子构件和容器构件对象声明接口，在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法，如增加子构件、删除子构件、获取子构件等。
 *
 * Leaf（叶子构件）：它在组合结构中表示叶子节点对象，叶子节点没有子节点，它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法，可以通过异常等方式进行处理。
 *
 * Composite（容器构件）：它在组合结构中表示容器节点对象，容器节点包含子节点，其子节点可以是叶子节点，也可以是容器节点，它提供一个集合用于存储子节点，实现了在抽象构件中定义的行为，包括那些访问及管理子构件的方法，在其业务方法中可以递归调用其子节点的业务方法。
 */
public class Client {
    public static void main(String[] args) {
        //创建根节点
        Component root = new Composite("清华大学");
        root.add(new Leaf("电子工程学院"));
        root.add(new Leaf("软件学院"));

        //二级节点
        Component second = new Composite("国际学院");
        second.add(new Leaf("社交系"));
        second.add(new Leaf("礼仪系"));

        //三级节点
        Component third = new Composite("舞蹈系");
        third.add(new Leaf("拉丁舞班"));
        third.add(new Leaf("名族舞"));
        second.add(third);

        root.add(second);
        root.print();
    }
}
